from flask import Blueprint, render_template, request, jsonify
from flask_login import current_user

converter_tools_bp = Blueprint('converter_tools', __name__, url_prefix='/converter-tools')


@converter_tools_bp.route('/')
def index():
    """数据转换工具首页"""
    tools = [
        {
            'name': '单位换算',
            'slug': 'unit-converter',
            'description': '长度、重量、面积等常用单位互换计算器',
            'icon': 'fa-calculator'
        },
        {
            'name': '进制转换',
            'slug': 'base-converter',
            'description': '二进制、十进制、十六进制等数字进制转换',
            'icon': 'fa-exchange-alt'
        },
        {
            'name': '日期计算',
            'slug': 'date-calculator',
            'description': '日期加减、两个日期间隔计算等',
            'icon': 'fa-calendar-alt'
        },
        {
            'name': '货币转换',
            'slug': 'currency-converter',
            'description': '基于最新汇率的全球货币转换工具',
            'icon': 'fa-money-bill-wave'
        }
    ]
    
    return render_template('tools/converter/index.html', tools=tools)


@converter_tools_bp.route('/unit-converter', methods=['GET', 'POST'])
def unit_converter():
    """单位换算工具"""
    if request.method == 'POST':
        try:
            data = request.json
            value = float(data.get('value', 0))
            from_unit = data.get('from_unit', '')
            to_unit = data.get('to_unit', '')
            unit_type = data.get('unit_type', '')
            
            # 判断参数是否完整
            if not all([value, from_unit, to_unit, unit_type]):
                return jsonify({'error': 1, 'message': '请提供完整的参数'}), 400
                
            # 获取转换结果
            result = convert_unit(value, from_unit, to_unit, unit_type)
            if result is None:
                return jsonify({'error': 1, 'message': '不支持的单位转换'}), 400
                
            return jsonify({
                'error': 0,
                'result': result,
                'from_unit': from_unit,
                'to_unit': to_unit,
                'value': value
            })
            
        except ValueError:
            return jsonify({'error': 1, 'message': '无效的数值'}), 400
        except Exception as e:
            return jsonify({'error': 1, 'message': f'转换失败: {str(e)}'}), 500
    
    # GET请求返回页面
    unit_types = {
        'length': {
            'name': '长度',
            'units': {
                'mm': '毫米',
                'cm': '厘米',
                'm': '米',
                'km': '千米',
                'in': '英寸',
                'ft': '英尺',
                'yd': '码',
                'mi': '英里'
            }
        },
        'weight': {
            'name': '重量',
            'units': {
                'mg': '毫克',
                'g': '克',
                'kg': '千克',
                't': '吨',
                'oz': '盎司',
                'lb': '磅',
                'st': '英石'
            }
        },
        'area': {
            'name': '面积',
            'units': {
                'mm2': '平方毫米',
                'cm2': '平方厘米',
                'm2': '平方米',
                'km2': '平方千米',
                'ha': '公顷',
                'in2': '平方英寸',
                'ft2': '平方英尺',
                'ac': '英亩',
                'mi2': '平方英里'
            }
        },
        'volume': {
            'name': '体积',
            'units': {
                'ml': '毫升',
                'l': '升',
                'm3': '立方米',
                'in3': '立方英寸',
                'ft3': '立方英尺',
                'gal': '加仑',
                'pt': '品脱'
            }
        },
        'temperature': {
            'name': '温度',
            'units': {
                'c': '摄氏度',
                'f': '华氏度',
                'k': '开尔文'
            }
        }
    }
    
    return render_template('tools/converter/unit_converter.html', unit_types=unit_types)


def convert_unit(value, from_unit, to_unit, unit_type):
    """单位换算函数"""
    # 转换为标准单位的系数
    conversion_factors = {
        'length': {
            'mm': 0.001,
            'cm': 0.01,
            'm': 1,
            'km': 1000,
            'in': 0.0254,
            'ft': 0.3048,
            'yd': 0.9144,
            'mi': 1609.344
        },
        'weight': {
            'mg': 0.000001,
            'g': 0.001,
            'kg': 1,
            't': 1000,
            'oz': 0.0283495,
            'lb': 0.453592,
            'st': 6.35029
        },
        'area': {
            'mm2': 0.000001,
            'cm2': 0.0001,
            'm2': 1,
            'km2': 1000000,
            'ha': 10000,
            'in2': 0.00064516,
            'ft2': 0.092903,
            'ac': 4046.86,
            'mi2': 2589988.11
        },
        'volume': {
            'ml': 0.000001,
            'l': 0.001,
            'm3': 1,
            'in3': 0.0000163871,
            'ft3': 0.0283168,
            'gal': 0.00378541,
            'pt': 0.000473176
        }
    }
    
    # 温度需要特殊处理
    if unit_type == 'temperature':
        if from_unit == to_unit:
            return value
        
        # 先转换为开尔文
        if from_unit == 'c':
            kelvin = value + 273.15
        elif from_unit == 'f':
            kelvin = (value - 32) * 5/9 + 273.15
        else:  # 已经是开尔文
            kelvin = value
        
        # 从开尔文转换为目标单位
        if to_unit == 'c':
            return kelvin - 273.15
        elif to_unit == 'f':
            return (kelvin - 273.15) * 9/5 + 32
        else:  # 转换为开尔文
            return kelvin
    
    # 普通单位转换
    if unit_type not in conversion_factors or from_unit not in conversion_factors[unit_type] or to_unit not in conversion_factors[unit_type]:
        return None
    
    # 转换为标准单位，然后转换为目标单位
    standard_value = value * conversion_factors[unit_type][from_unit]
    result = standard_value / conversion_factors[unit_type][to_unit]
    
    return result 